# 斐波那契数列
def fib(n):
    if n < 2:
        return n
    else:
        return fib(n - 2) + fib(n - 1)
print(fib(7))

# 快排
def quick(qlist):
     if len(qlist) == 0:
        return qlist
     else:
        qb = qlist[0]
        qa = quick([l for l in qlist[1:] if l <= qb])  # 如果 l小于qb中心轴数据 返回l，不小于就不返回这个元素 的列表在带入函数做递归，得到左子序列
        qc = quick([r for r in qlist[1:] if r > qb])  # 如果r大于qa 返回r，否则不返回这个元素的列表，列表集合在带入函数做递归，得到右子序列
     return qa + [qb] + qc  # 没有小于等于，或者大于的数据时，多次返回拼装好的数据，再去被递归，最后得到排序好的左子序列 + 中心轴元素 + 右子序列

print(quick([232, 42, 3, 52, 24, 3224, 164, 32]))

# 随机插入排序
def insertQuick(qlist):
    for i in range(1, len(qlist)):
        key = qlist[i]  # 得到列表1开始的游标位置
        j = i - 1  # 得到第0个游标位置
        while j >= 0 and key < qlist[j]:  # 当第0个游标 >=0 且 第一个元素值小于第0个元素值时，执行下边代码
            qlist[j + 1] = qlist[j]  # 将第0个元素赋值给第一个元素
            j -= 1  # 0游标变成-1
            qlist[j + 1] = key  # 第一个元素赋值给第0个，因为上边j -1了所以，j+1 还是j ，实现元素交换
    return qlist

print(insertQuick([32, 4, 243, 52, 23525, 1, 41]))


# 99乘法表
def n_n():
    for i in range(1, 10):
        for j in range(1, i +1):
            print(f'{j} * {i} = {i*j} ', end=' ')
        print('\t')
print(n_n())


# 统计字符串中出现次数最多的字符和次数
def countStr(s):
    d1 = {}
    for i in s:
        if i not in d1:
            d1[i] = 1
        else:
            d1[i] += 1
    for k, v in d1.items():
        if v == max(d1.values()):
            print(k, v)

countStr("HFJSDHFjjjjhfsdjdsKJF")

# Switch语句
# sw = {"a": 1, "b": 2, "c": 3}
# userInput = input()
# print(sw[userInput])


# filter() 筛选功能,需要list来列表化
s1 = ['李大钊', "董存瑞", "刘胡兰", "列宁"]
# kediedai = filter(lambda x: not x.startswith("李"), s1)
print(list(filter(lambda x: not x.startswith("李"), s1)))

# map()映射方法
def add(i):
    return i * 8
r = map(add, [2, 3, 4])
print(r.__next__())
print(r.__next__())


# 获取list索引位置
list = [2, 353, 23, 23]
print(list.index(23))


# 判断字符串中大写的几个，小写的几个
def strB():
    s1 = "ASDNJnjsandjksanKDJ"
    a = 0
    b = 0
    for i in s1:
        if i.isupper():
            a += 1
        elif i.islower():
            b += 1
    print(f"大写的{a}个，小写的{b}个")
strB()

# 修改元组内部元素不可修改
tp = (1, 2, 3, [1, 2, 3, 54])
tp[3][2] = 456
print(tp)

# 列表推导式
print([i for i in range(10)])

# 集合推导式
print({i for i in range(10)})

# 字典推导式
list2 = ["暴风城","铁炉堡","达纳苏斯"]
dic = {i: list2[i] for i in range(len(list2))}
print(dic)